package com.fs.sys.service;

import com.fs.sys.bean.dto.AppDTO;
import com.fs.sys.entityservice.AppEntityService;
import com.fs.sys.entityservice.UserAppEntityService;
import com.fs.common.exception.AppException;
import com.fs.sys.bean.dto.TenantDTO;
import com.fs.common.ErrorCodes;
import com.fs.sys.entityservice.TenantEntityService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * 用户应用服务
 *
 * @author LiuQi 2025/6/14-12:03
 * @version V1.0
 **/
@Service
public class UserAppService {
    @Autowired
    private UserAppEntityService userAppEntityService;

    @Autowired
    private TenantAppService tenantAppService;

    @Autowired
    private TenantEntityService tenantEntityService;

    @Autowired
    private AppEntityService appEntityService;

    /**
     * 根据用户查找有权限访问的应用
     * @param userId 用户id
     * @return 用户有权限访问的应用
     */
    public List<AppDTO> findByUserCanVisit(String tenantId, String userId) {
        // 用户有权限访问的应用包含情况：
        // 1. 公共类型的应用所有人都可访问
        // 2. 如果用户是租户管理员，则可访问租户分配的应用或租户创建的应用
        // 3. 如果用户不是租户管理员，则只能访问已分配的应用，但又分多种情况，一是用户所属机构有的应用，二是用户角色有的应用，三是直接分配给用户的应用

        TenantDTO tenant = tenantEntityService.findById(tenantId).orElseThrow(() -> AppException.of(ErrorCodes.BASE_TENANT_NOT_EXISTS));
        List<AppDTO> apps = new ArrayList<>(16);
        if (userId.equals(tenant.getAdminId())) {
            // 是租户管理员，查租户有的应用列表
            apps.addAll(tenantAppService.findTenantCanVisitApps(tenantId));
        } else {
            // 查询公共应用
            List<AppDTO> publicApps = appEntityService.queryBuilder()
                    .eq("use_limit_type", "public")
                    .query();
            apps.addAll(publicApps);
        }

        List<String> appIds = userAppEntityService.findUserDispatchedAppIds(userId);
        if (!CollectionUtils.isEmpty(appIds)) {
            apps.addAll(appEntityService.findByIds(appIds));
        }

        // 去重并排序
        return apps.stream()
                .distinct()
                .sorted((a1, a2) -> {
                    String s1 = a1.getSort();
                    String s2 = a2.getSort();
                    return StringUtils.compare(s1, s2);
                }).toList();
    }

    /**
     * 查询租户可访问应用列表
     * @param tenantId 租户id
     * @return 租户可访问应用列表
     */
    public List<AppDTO> findByTenantCanVisit(String tenantId) {
        return tenantAppService.findTenantCanVisitApps(tenantId);
    }

    /**
     * 根据用户删除关系
     * @param userIds 用户id列表
     */
    public void deleteByUser(List<String> userIds) {
        userAppEntityService.deleteBuilder()
                .in("user_id", userIds)
                .delete();;
    }
}
